DynamoDB StreamsのCloudWatch AlarmをCloudFormationで作る
DynamoDB StreamsのARNは、時刻情報を含んでいます。 そのため、複数のAWSアカウントでCloudWatch Alarmを作る場合は、DynamoDB StreamsのANRから時刻情報を取得する必要があります。
arn:aws:dynamodb:(略)/dynamodb-streams-sample-table/stream/2022-05-30T06:37:33.209
というわけで、やってみました。
おすすめの方
- DynamoDB StreamsのCloudWatch AlarmをCloudFormationで作りたい方
DynamoDB StreamsとLambdaとCloudWatch Alarmをデプロイする
DynamoDB Streamsで起動するLambdaも作成していますが、動作確認としてSuccessfulRequestLatency
メトリクスを反映させるためです。
sam init
sam init \ --runtime python3.9 \ --name DynamoDB-Streams-Alarm-Sample \ --app-template hello-world \ --package-type Zip
AWS SAMテンプレート
DynamoDB StreamsのARNを/
で分離し、3番目の要素を取得しています。(要素数は0始まり)
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: DynamoDB-Streams-Alarm-Sample Resources: SampleTable: Type: AWS::DynamoDB::Table Properties: TableName: dynamodb-streams-sample-table BillingMode: PAY_PER_REQUEST AttributeDefinitions: - AttributeName: todoId AttributeType: S KeySchema: - AttributeName: todoId KeyType: HASH StreamSpecification: StreamViewType: NEW_AND_OLD_IMAGES SampleTableSuccessfulRequestLatencyAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: dynamodb-streams-sample-table-successful-request-latency-alarm Namespace: AWS/DynamoDB Dimensions: - Name: TableName Value: dynamodb-streams-sample-table - Name: StreamLabel Value: !Select [3, !Split ['/', !GetAtt SampleTable.StreamArn]] - Name: Operation Value: GetRecords MetricName: SuccessfulRequestLatency ComparisonOperator: GreaterThanOrEqualToThreshold Period: 60 EvaluationPeriods: 1 Statistic: Average Threshold: 60000 # 60s TreatMissingData: notBreaching HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 Events: SampleTable: Type: DynamoDB Properties: BatchSize: 100 BisectBatchOnFunctionError: true MaximumRetryAttempts: 3 StartingPosition: TRIM_HORIZON Stream: !GetAtt SampleTable.StreamArn HelloWorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
Lambdaコード
def lambda_handler(event, context): for record in event['Records']: print(record)
デプロイ
sam build sam deploy \ --stack-name DynamoDB-Streams-Alarm-Sample-Stack \ --s3-bucket cm-fujii.genki-deploy \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset
CloudWatch Alarmができた
バッチリですね